package com.ruoyi.pay.task;

import com.ruoyi.pay.entity.OrderInfo;
import com.ruoyi.pay.service.AliPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 阿里支付定时查询订单的定时任务
 */
@Component
@Slf4j
public class AliPayTask {

    @Resource
    private AliPayService aliPayService;

    /**
     * 每隔30s执行一次查询，
     * 查询创建超过10分钟，并且未支付的订单
     *
     * 支付查单
     */
//    @Scheduled(cron = "0/60 * * * * ?")
    public void orderConfirm() {
        log.info("开始执行订单查询任务");

        // 创建一个固定大小的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

        // TODO 处理超时订单
        List<OrderInfo> orderInfos = aliPayService.queryTimeOutOrderInfo(10);

        List<Future<Void>> futures = new ArrayList<>();
        orderInfos.forEach(item -> {
            // 核实订单状态，调用支付宝查单接口
            aliPayService.checkOrderStatus(item.getOrderNo());

            // 多线程取执行核实订单的操作
            Future<Void> future = executorService.submit(() -> {
                aliPayService.checkOrderStatus(item.getOrderNo());
                return null; // 返回Void，因为checkOrderStatus无返回值
            });
            futures.add(future);
        });


        // 等待所有任务完成
        for (Future<Void> future : futures) {
            try {
                future.get(); // 阻塞等待任务完成，此处也可以设置超时时间
            } catch (InterruptedException | ExecutionException e) {
                log.error("处理订单状态时发生异常", e);
            }
        }

        this.closeExec(executorService);
    }

    /**
     * 退款查单
     * 每隔29s执行一次查询，查询创建超过10分钟，并且退款中的订单
     */
    // @Scheduled(cron = "0/29 * * * * ?")
    public void refundConfirm() {
        log.info("开始执行退款查询任务");
    }



    private void closeExec(ExecutorService executorService){
        // 关闭线程池
        executorService.shutdown();
        while (!executorService.isTerminated()) {
            // 等待所有线程执行完毕
        }
        log.info("订单状态查询任务执行完毕");
    }
}
